package com.kmxd.ams.app.search.command;

import cn.easyes.core.conditions.select.LambdaEsQueryWrapper;
import cn.hutool.core.util.ObjectUtil;
import com.google.common.collect.Lists;
import com.kmxd.ams.client.archive.IArchiveAuthRuleSvc;
import com.kmxd.ams.core.common.bo.ConditionBO;
import com.kmxd.ams.core.util.SecurityUtil;
import java.util.LinkedHashSet;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * 条件构造器
 *
 * @author zuolg
 */
@Slf4j
@Component
@AllArgsConstructor
public class ConditionCmd {

  private final IArchiveAuthRuleSvc archiveAuthRuleSvc;

  /**
   * 添加特殊利用权限
   *
   * @param wrapper
   * @param <T>
   */
  public <T> void addSpecialAuth(LambdaEsQueryWrapper<T> wrapper) {
    // 权限设置
    LinkedHashSet<ConditionBO> conditions = archiveAuthRuleSvc.getAuthRuleByUser(SecurityUtil.getLoginUser());
    if (ObjectUtil.isEmpty(conditions)) {
      return;
    }
    List<ConditionBO> conditions2 = Lists.newArrayList();
    conditions2.addAll(conditions);
    //    String sql = QueryUtil.buildEsSql(conditions2, null, false);
    //    wrapper.queryStringQuery(sql);
    wrapper.or(
        wp -> {
          wp.queryStringQuery(SpecialAuthCmd.getQueryStr(conditions2));
        });
  }

  /**
   * 特殊权限，查询查询语句
   *
   * @return
   */
  public String getSpecialAuth() {
    // 权限设置
    LinkedHashSet<ConditionBO> conditions = archiveAuthRuleSvc.getAuthRuleByUser(SecurityUtil.getLoginUser());
    List<ConditionBO> conditions2 = Lists.newArrayList();
    conditions2.addAll(conditions);
    return SpecialAuthCmd.getQueryStr(conditions2);
  }

  /**
   * 获取条件
   *
   * @param wq
   * @param item
   * @param <T>
   */
  public static <T> void getWp(LambdaEsQueryWrapper<T> wq, ConditionBO item) {
    if (ObjectUtil.isEmpty(item.getOperator())) {
      return;
    }
    switch (item.getOperator()) {
        // 等于
      case EQ:
        wq.eq(item.getKey(), item.getValue());
        break;
        // 不等于
      case NOT_EQ:
        wq.not().eq(item.getKey(), item.getValue());
        break;
        // 大于
      case GE:
        wq.gt(item.getKey(), item.getValue());
        break;
        // 大于等于
      case GE_EQ:
        wq.ge(item.getKey(), item.getValue());
        break;
        // 小于
      case LE:
        wq.lt(item.getKey(), item.getValue());
        break;
        // 小于等于
      case LE_EQ:
        wq.le(item.getKey(), item.getValue());
        break;
        // 包含
      case LIKE:
        wq.like(item.getKey(), item.getValue());
        break;
        // 不包含
      case NOT_LIKE:
        wq.not().like(item.getKey(), item.getValue());
        break;
        // 为空
      case EMPTY:
        wq.eq(item.getKey(), "");
        break;
        // 不为空
      case NOT_EMPTY:
        wq.not().eq(item.getKey(), "");
        break;
      default:
        break;
    }
  }
}
